package br.com.rglariguet.pioneer.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.rglariguet.pioneer.filtropesquisa.FiltroPedidoPeca;
import br.com.rglariguet.pioneer.modelos.Pedido;
import br.com.rglariguet.pioneer.util.PecaUtil;

import com.google.common.base.Strings;

@Repository
@Transactional
public class PedidoDAO extends DaoGenerico<Pedido> {
	
	@Autowired
	private PecaDAO pecaDao;
	
	public List<Pedido> listarTodos() {
		return (List<Pedido>) getSession().createQuery("from Pedido as pedido").list();
	}

	public List<Pedido> listarComFiltro(FiltroPedidoPeca filtro) {

		StringBuilder sql = new StringBuilder();
		Map<String, Object> parametros = new HashMap<String, Object>();

		sql.append("select distinct pedido from Pedido pedido join fetch pedido.pedidosPeca pp ");
		sql.append("where 0 = 0 and ");

		if (filtro.getDataPedidoDe() != null) {
			sql.append("pedido.dataDoPedido >= :dataPedidoDe and ");
			parametros.put("dataPedidoDe", filtro.getDataPedidoDe());
		}
		if (filtro.getDataPedidoAte() != null) {
			sql.append("pedido.dataDoPedido <= :dataPedidoAte and ");
			parametros.put("dataPedidoAte", filtro.getDataPedidoAte());
		}
		
		
		String codigoPeca = filtro.getCodigoDaPeca();
		if (PecaUtil.validaPecaComTraco(filtro.getCodigoDaPeca()) && PecaUtil.pecaExiste(filtro.getCodigoDaPeca(), pecaDao)) {
			codigoPeca = filtro.getCodigoDaPeca().split(" - ")[0];
		}
		if (!Strings.isNullOrEmpty(codigoPeca)) {
			sql.append("pp.peca.codigo like :codigoPeca and ");
			parametros.put("codigoPeca", codigoPeca);
		}
		if (!Strings.isNullOrEmpty(filtro.getNumeroDoPedido())) {
			sql.append("pedido.numeroPedido like :numeroDoPedido and ");
			parametros.put("numeroDoPedido", filtro.getNumeroDoPedido());
		}

		if (filtro.getStatusPedido() != null) {
			sql.append("pp.status = :statusPedido and ");
			parametros.put("statusPedido", filtro.getStatusPedido());
		}

		sql.append("0 = 0 ");
		sql.append("order by pedido.dataDoPedido");

		Query query = getSession().createQuery(sql.toString());

		for (Map.Entry<String, Object> paramentro : parametros.entrySet()) {
			if (paramentro.getValue().getClass().toString().contains("String")) {
				query.setParameter(paramentro.getKey(), "%" + paramentro.getValue() + "%");
			} else {
				query.setParameter(paramentro.getKey(), paramentro.getValue());
			}
		}

		return (List<Pedido>) query.list();
	}
}
